package io.github.hadyang.leetcode.random;

import org.junit.Test;

/**
 * 如果字符串中的所有字符都相同，那么这个字符串是单字符重复的字符串。
 *
 * <p>给你一个字符串 text，你只能交换其中两个字符一次或者什么都不做，然后得到一些单字符重复的子串。返回其中最长的子串的长度。
 *
 * <p>
 *
 * <p>示例 1：
 *
 * <p>输入：text = "ababa" 输出：3 示例 2：
 *
 * <p>输入：text = "aaabaaa" 输出：6 示例 3：
 *
 * <p>输入：text = "aaabbaaa" 输出：4 示例 4：
 *
 * <p>输入：text = "aaaaa" 输出：5 示例 5：
 *
 * <p>输入：text = "abcdef" 输出：1
 *
 * <p>提示：
 *
 * <p>1 <= text.length <= 20000 text 仅由小写英文字母组成。
 *
 * <p>来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/swap-for-longest-repeated-character-substring
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class Q1156 {
  public int maxRepOpt1(String text) {
    if (text.length() == 1) {
      return 1;
    }

    int[] counter = new int[26];
    for (int i = 0; i < text.length(); i++) {
      counter[text.charAt(i) - 'a']++;
    }

    int[] rep = new int[text.length()];
    int start = 0;
    rep[0] = 1;
    for (int i = 1; i < text.length(); i++) {
      if (text.charAt(i) == text.charAt(i - 1)) {
        rep[i] = rep[i - 1] + 1;
        for (int j = start; j < i; j++) {
          rep[j] = rep[i];
        }
      } else {
        rep[i] = 1;
        start = i;
      }
    }

    int res = 0;
    int len = 0;
    for (int i = 0; i < text.length(); i++) {
      len = rep[i];
      char target = text.charAt(i);
      int count = counter[target - 'a'];

      if (count > rep[i]) {
        if (i + 1 < rep.length && text.charAt(i + 1) != target) {
          if (i + 2 < rep.length && text.charAt(i + 2) == target) {
            len += rep[i + 2];
            if (count > (rep[i] + rep[i + 2])) {
              len++;
            }

          } else {
            len++;
          }
        }
      }

      res = Math.max(len, res);
    }

    return res;
  }


  @Test
  public void test() {
    System.out.println(maxRepOpt1("ababa"));
    System.out.println(maxRepOpt1("aaabaaa"));
    System.out.println(maxRepOpt1("aaabbaaa"));
    System.out.println(maxRepOpt1("aaaaa"));
    System.out.println(maxRepOpt1("abcdef"));
    System.out.println(maxRepOpt1("aabaabaabbbaaabbbaabab"));
  }
}
